Android系统启动流程(三)解析SyetemServer进程启动过程
前言
上一篇我们学习了Zygote进程,并且知道Zygote进程启动了SyetemServer进程,那么这一篇我们就来学习Android7.0版本的SyetemServer进程的启动过程。
1.Zygote启动SyetemServer进程
在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
2.SyetemServer进程启动过程
handleSystemServerProcess函数的代码如下所示。
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
启动Binder线程池
接着我们来查看nativeZygoteInit函数对用的JNI文件,如下所示。
frameworks/base/core/jni/AndroidRuntime.cpp
这里gCurRuntime是AndroidRuntime类型的指针,AndroidRuntime的子类AppRuntime在app_main.cpp中定义,我们来查看AppRuntime的onZygoteInit函数,代码如下所示。
frameworks/base/cmds/app_process/app_main.cpp
invokeStaticMain
我们再回到RuntimeInit.java的代码,在注释2处调用了applicationInit函数,代码如下所示。
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
3.解析SyetemServer进程
我们先来查看SystemServer的main函数:
frameworks/base/services/java/com/android/server/SystemServer.java
引导服务 | 作用 |
---|---|
Installer | 系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务 |
ActivityManagerService | 负责四大组件的启动、切换、调度。 |
PowerManagerService | 计算系统中和Power相关的计算,然后决策系统应该如何反应 |
LightsService | 管理和显示背光LED |
DisplayManagerService | 用来管理所有显示设备 |
UserManagerService | 多用户模式管理 |
SensorService | 为系统提供各种感应器服务 |
PackageManagerService | 用来对apk进行安装、解析、删除、卸载等等操作 |
核心服务 | |
BatteryService | 管理电池相关的服务 |
UsageStatsService | 收集用户使用每一个APP的频率、使用时常 |
WebViewUpdateService | WebView更新服务 |
其他服务 | |
CameraService | 摄像头相关服务 |
AlarmManagerService | 全局定时器管理服务 |
InputManagerService | 管理输入事件 |
WindowManagerService | 窗口管理服务 |
VrManagerService | VR模式管理服务 |
BluetoothService | 蓝牙管理服务 |
NotificationManagerService | 通知管理服务 |
DeviceStorageMonitorService | 存储相关管理服务 |
LocationManagerService | 定位管理服务 |
AudioService | 音频相关管理服务 |
... | .... |
比如要启动PowerManagerService则会调用如下代码:
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
注释1处的代码用来创建SystemService,这里的SystemService是PowerManagerService,在注释2处将PowerManagerService添加到mServices中,这里mServices是一个存储SystemService类型的ArrayList。接着调用PowerManagerService的onStart函数启动PowerManagerService并返回,这样就完成了PowerManagerService启动的过程。
除了用mSystemServiceManager的startService函数来启动系统服务外,也可以通过如下形式来启动系统服务,以PackageManagerService为例:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/SystemServer.java
4.总结SyetemServer进程
SyetemServer在启动时做了如下工作:
1.启动Binder线程池,这样就可以与其他进程进行通信。
2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。
3.启动各种系统服务。